home *** CD-ROM | disk | FTP | other *** search
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;; ;;
- ;;;;;;;;;;;;;;;;;;;;;;; SPRITER NAVI Dj. ;;
- ;;;;;;;;;;;;;;;;;;;;;;; ∙∙∙∙∙∙∙ ∙∙∙∙∙∙∙∙ ;;
- ;;;;;;;;;;;;;;;;;;;;;;; Usando GRAPH v1.2 ;;
- ;;;;;;;;;;;;;;;;;;;;;;; ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .MODEL SMALL
- .STACK
- .386
-
- .DATA
- FilePCX DB 13 DUP (0) ; Nombre del fichero PCX.
- SprName DB 13 DUP (0) ; Nombre del fichero de sprite.
- PVirtual DB 0 ; PV del PCX.
- Color DB 0 ; Color del rectángulo.
- CoorX1 DW 0
- CoorY1 DW 0
- CoorX2 DW 0
- CoorY2 DW 0 ; Coordenadas del rectangulo.
- SizeX DW 0
- SizeY DW 0 ; Tamaño X e Y del sprite.
- Sprite DB 0 ; Handle de sprite.
- Handle DW 0 ; Handle del fichero.
- ERROR DB ' ERROR: Debe indicar en la línea de comandos lo siguiente:',0Dh,0Ah
- DB ' SPRITER /Pnombre_pcx /Snombre_spr [/Ccolor]$'
- Msg1 DB 'Tamaño X: $'
- Msg2 DB 0Dh,0Ah,'Tamaño Y: $'
-
- .CODE
- INCLUDE GRFLIB.INC
-
- InicMouse PROC ; Resetea el ratón.
- XOR AX, AX
- INT 33h
- MOV AX, 1
- INT 33h
- MOV AX, 0Fh
- MOV CX, 8
- MOV DX, 16
- INT 33h
- XOR CX, CX
- MOV DX, 319 ; Tamaño X
- MOV AX, 7
- INT 33h
- XOR CX, CX
- MOV DX, 199 ; Tamaño Y
- MOV AX, 8
- INT 33h
- RET
- InicMouse ENDP
-
- ShowMouse PROC ; Muestra el puntero del mouse.
- MOV AX, 1
- INT 33h
- RET
- ShowMouse ENDP
-
- HideMouse PROC ; Quita el puntero del mouse.
- MOV AX, 2
- INT 33h
- RET
- HideMouse ENDP
-
- AskMouse PROC
- MOV AX, 3 ; Devuelve en BX los botones y en
- INT 33h ; CX,DX la posición X e Y.
- SHR CX, 1
- RET
- AskMouse ENDP
-
- LineaCmds PROC
- MOV DI, 80h ; Apunta a la línea de comandos.
- XOR CH, CH
- MOV CL, ES:[DI] ; Cogemos la longitud.
- INC DI
- MOV [Color], 15 ; Color predeterminado.
-
- @@BuscaCaracter:
- MOV AL, ES:[DI]
- INC DI
- CMP AL, '/'
- JNE @@BuscaCaracter
- CMP DI, 0FFh
- JA @@Final
- @@Comando:
- MOV AL, ES:[DI]
- INC DI
- CMP AL, 'P' ; Nombre del PCX.
- JE @@PCXName
- CMP AL, 'S'
- JE @@SPRName
- CMP AL, 'C'
- JNE @@BuscaCaracter
- @@Color:
- MOV AL, ES:[DI]
- INC DI
- SUB AL, 30h
- JS @@BuscaCaracter
- CMP AL, 9
- JA @@BuscaCaracter
- MOV [Color], AL
- JMP @@BuscaCaracter
- @@SPRName:
- MOV SI, Offset SPRName
- @@BucleSPR:
- MOV AL, ES:[DI]
- INC DI
- CMP AL, ' '
- JE @@FinSPR
- PUSH DI
- SUB DI, CX
- SUB DI, 2
- CMP DI, 80h
- POP DI
- JNB @@FinSPR
- MOV DS:[SI], AL
- INC SI
- JMP @@BucleSPR
- @@FinSPR:
- MOV BYTE PTR DS:[SI], 0
- JMP @@BuscaCaracter
- @@PCXName:
- MOV SI, Offset FilePCX
- JMP @@BucleSPR ; Es lo mismo.
- @@Final:RET
- LineaCmds ENDP
-
- Word2Str PROC ; Recibe en AX la WORD a convertir.
- XOR BX, BX
- @@BucleW:
- XOR DX, DX
- MOV CX, 10
- DIV CX
- PUSH DX
- INC BX
- OR AX, AX
- JNZ @@BucleW
- @@BucleS:
- POP AX
- ADD AL, 30h
- MOV AH, 0Eh
- PUSH BX
- MOV CX, 1
- XOR BX, BX
- INT 10h
- POP BX
- DEC BX
- JNZ @@BucleS
- RET
- Word2Str ENDP
-
- ;;; F U N C I α N P R I N C I P A L .
-
- Spriter PROC
- MOV AX, @DATA
- MOV DS, AX
- CALL LiberaMEM
- CALL ModoGrafico ; Encendemos GRAPH.
- CALL TrataError
-
- CALL CreaVirtual ; Pedimos una PV.
- CALL TrataError
- MOV [PVirtual], AL
- CALL LineaCmds ; Se lee la línea de comandos.
- PUSH DS
- MOV DX, Offset FilePCX
- MOV AL, [PVirtual]
- CALL LeePCX ; Leemos el fichero.
- CALL TrataError
- POP DS
- CMP AL, 0FFh
- JE @@Sacabou
- PUSH AX
- MOV AH, AL
- XOR AL, AL
- XOR BL, BL
- CALL PonPaleta ; Inserta la paleta.
- CALL TrataError
- POP AX
- CALL DestPaleta ; Libera memoria no utilizada.
- CALL TrataError
- XOR CX, CX
- MOV DX, Offset SprName
- MOV AX, 3C00h
- INT 21h ; Abre el fichero.
- JC @@Sacabou
- MOV [Handle], AX ; Guarda el handle.
-
- MOV AL, [PVirtual]
- XOR AH, AH ; VGA
- CALL CopiaPantalla ; Copiamos la pantalla a la VGA
- CALL TrataError
- CALL InicMouse
- @@BuclePPal:
- CALL AskMouse ; Pregunta a ver que esta pasando.
- OR BX, BX
- JZ @@BuclePPal ; Vuelve...
- CMP BX, 2
- JE @@SalvaSprite ; Graba el sprite.
- CMP BX, 1
- JE @@CogeCuadro ; Empieza a dibujar el rectangulo.
- CMP BX, 3
- JNE @@BuclePPal ; Vuelve...
-
- @@Finalizar:
- CALL HideMouse
- MOV AL, [PVirtual]
- CALL DestVirtual ; Devuelve la memória.
- XOR DX, DX
- MOV CX, 8000h
- CALL FadeDown ; Hace un fade.
- CALL ModoTexto
- MOV AH, 9
- MOV DX, Offset Msg1
- INT 21h
- MOV AX, [SizeX]
- CALL Word2Str
- MOV AH, 9
- MOV DX, Offset Msg2
- INT 21h
- MOV AX, [SizeY]
- CALL Word2Str
- MOV AX, 4C00h
- INT 21h ; Salir al DOS.
-
- @@Sacabou: CALL ModoTexto
- MOV AH, 9
- MOV DX, Offset ERROR
- INT 21h
- MOV AX, 4C01h
- INT 21h
-
- @@SalvaSprite:
- MOV BX, [CoorX1]
- MOV SI, [CoorY1]
- MOV DX, [CoorX2]
- MOV DI, [CoorY2]
- MOV AL, [PVirtual]
- CALL GetImagen ; Coge el sprite.
- MOV [Sprite], AL
- CALL SegmentoSprite ; Nos devuelve el handle de sprite.
- MOV AL, [Sprite]
- CALL DestSprite ; Deja memoria libre.
- MOV AX, [CoorX2]
- SUB AX, [CoorX1] ; Calculamos la base del rectángulo.
- JNS @@SignoOK1
- NEG AX
- @@SignoOK1:
- MOV [SizeX], AX
- MOV CX, [CoorY2]
- SUB CX, [CoorY1] ; Calculamos la altura del rectángulo.
- JNS @@SignoOK2
- NEG CX
- @@SignoOK2:
- MOV [SizeY], CX
- PUSH DS
- MOV BX, [Handle] ; Cogemos el handle antes de cargar-
- PUSH BX ; nos BX.
- PUSH ES
- POP DS
- XOR DX, DX ; S = b * h
- MUL CX ; El resultado en AX, porque nunca
- POP BX ; puede en una pantalla de 320x200
- MOV CX, AX ; cogerse un sprite de más de un
- MOV AH, 40h ; segmento.
- INT 21h
- POP DS
- MOV BX, [Handle]
- MOV AH, 3Eh
- INT 21h ; Cierra el fichero.
- JMP @@Finalizar
-
- @@CogeCuadro:
- MOV [CoorX1], CX
- MOV [CoorY1], DX ; Guarda las coordenadas iniciales.
- @@Bucle2:
- CALL AskMouse
- PUSH BX
- PUSH CX
- PUSH DX
- CALL HideMouse
- ; WaitVR
- MOV AL, [PVirtual]
- XOR AH, AH
- CALL CopiaPantalla ; Cópia la pantalla virtual.
- MOV DI, DX
- MOV DX, CX
- MOV BX, [CoorX1]
- MOV SI, [CoorY1]
- MOV CL, [Color]
- XOR AL, AL
- CALL Rectangulo ; Dibuja el rectángulo.
- CALL ShowMouse
- POP DX
- POP CX
- POP BX
- AND BX, 1
- JNZ @@Bucle2 ; Seguir esperando.
- MOV [CoorX2], CX
- MOV [CoorY2], DX ; Guarda las coordenadas finales.
- JMP @@BuclePPal
- Spriter ENDP
- END Spriter
-